package thread;

import java.util.Date;
import java.util.concurrent.*;

/**
 * @Author zhangxuhui
 * @Date 2023/12/18
 * @email zxh_1633@163.com
 * 线程池其实就是一种多线程处理形式，处理过程中可以将任务添加到队列中，
 * 然后在创建线程后自动启动这些任务。
 *  Executors.newSingleThreadExecutor();	创建一个单一的线程池
 *  Executors.newFixedThreadPool(int nThreads);	创建一个固定大小的线程池，参数填线程池大小
 *  Executors.newCachedThreadPool();	创建一个可伸缩的线程池，遇强则强，遇弱则弱
 *
 *  线程池的7大核心参数
 * nt corePoolSize	核心线程池大小
 * int maximumPoolSize	最核心大线程池大小
 * long keepAliveTime	超时时间 没有人使用会自动释放
 * TimeUnit unit	超时单位
 * BlockingQueue<Runnable> workQueue	阻塞队列
 * ThreadFactory threadFactory	线程工厂，创建线程的，一般不用动
 * RejectedExecutionHandler handler	拒绝策略
 *
 * 拒绝策略
 * new ThreadPoolExecutor.AbortPolicy() 	线程池默认拒绝策略，如果元素添加到线程池失败，会抛出RejectedExecutionException异常
 * new ThreadPoolExecutor.CallerRunsPolicy() 	如果添加失败，那么主线程会自己调用执行器中的execute方法来执行任务
 * new ThreadPoolExecutor.DiscardPolicy()	如果添加失败，则放弃，不会抛出异常
 * new ThreadPoolExecutor.DiscardOldestPolicy()	如果添加到线程池失败，会将队列中最早添加的元素移除，再尝试添加，如果失败则按该策略不断重试
 */
public class ThreadPoolTest {
    public static void main(String[] args) {
        //Inspection '线程池不允许使用Executors去创建，而是通过ThreadPoolExecutor的方式，这样的处理方式让写的同学更加明确线程池的运行规则，规避资源耗尽的风险。' options
        //ExecutorService pool = Executors.newCachedThreadPool();
        int i = Runtime.getRuntime().availableProcessors();
        System.out.println("cpu:"+i);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(i, i * 2,
                2, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>(),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());


            for (int j = 0; j < 10; j++) {
                pool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+":"+new Date());
                });
            }

    }
}
